package org.finesys.common.excel.enums;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 字典接口信息
 */
public interface DictEnum {

    String getValue();

    String getLabel();

    default boolean eq(Object o) {
        return this == o || Objects.equals(o, this.getValue());
    }

    /**
     * 通过value获取名称
     */
    static <E extends DictEnum> String getLabelByValue(E[] enums, String value) {
        return Arrays.stream(enums).map(DictEnum::getValue).filter(eValue -> {
            return Objects.equals(eValue, value);
        }).findFirst().orElse(null);
    }

    /**
     * 通过名称获取value
     */
    static <E extends DictEnum> String getValueByLabel(E[] enums, String label) {
        return Arrays.stream(enums).map(DictEnum::getLabel).filter(eValue -> {
            return Objects.equals(eValue, label);
        }).findFirst().orElse(null);
    }

    /**
     * 获取字典信息
     */
    static DictEnum of(String value, String label) {
        return new DictEnum() {
            @Override
            public String getValue() {
                return value;
            }

            @Override
            public String getLabel() {
                return label;
            }
        };
    }

    static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private final List<DictEnum> items = new ArrayList<>();

        public Builder() {

        }

        public Builder add(String value, String label) {
            this.items.add(DictEnum.of(value, label));
            return this;
        }

        public DictEnum[] build() {
            return (DictEnum[]) this.items.toArray(new DictEnum[0]);
        }
    }
}
